package com.study.七大原则.o5开闭原则;

/**
 * 方式一的改进思路分析
 * <p>
 * 思路：把创建Shape类做成抽象类，并提供一个抽象的draw方法，让子类去实现即可，这样我们有新的图形种类时，
 * 只需要让新的图形类继承Shape，并实现draw方法即可， ==使用方的代码就不需要修改了==》满足了开闭原则
 */
public class Ocp2 {

    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
        graphicEditor.drawShape(new OtherGraphic());

    }

    //新增图形时，使用方不需要修改代码
    static class GraphicEditor {
        public void drawShape(Shape s){
            s.draw();
        }
    }


    static abstract class Shape {
        abstract void draw();
    }

    static class Rectangle extends Shape {
        @Override
        void draw() {
            System.out.println("绘制矩形");
        }
    }

    static class Circle extends Shape {
        @Override
        void draw() {
            System.out.println("绘制圆形");
        }
    }

    //新增的三角形
    static class Triangle extends Shape {
        @Override
        void draw() {
            System.out.println("绘制三角形");
        }
    }

    //新增一个其他图形
    static class OtherGraphic extends Shape{

        @Override
        void draw() {
            System.out.println("绘制其他图形");
        }
    }
}
